#ifndef DEVICES_TIMER_H
#define DEVICES_TIMER_H

#include <round.h>
#include <stdint.h>
#include "list.h"
#include "../threads/thread.h"

/* Number of timer interrupts per second. */
#define TIMER_FREQ 100

// kernel timer struct maintained by kernel
// for processing the request by threads
typedef struct timer_t {
	struct list_elem elem;

	int64_t expires;	// timer tick at which this timer expire
	void (*foo)(unsigned long);	// function to wall on expiration
	unsigned long data;	// auxilary data to function foo

	struct thread *task;	// owner thread 
} timer_t;

void init_timer(timer_t *t);	// initialize the timer
void add_timer (timer_t *t);	// add timer t to kernel timer_list
void del_timer (timer_t *t);	// delete timer from timer_list

//---------------------
void timer_init (void);
void timer_calibrate (void);

int64_t timer_ticks (void);
int64_t timer_elapsed (int64_t);

/* @mk
 */
// called every timer ticks this function runs
// any pending registered timers by threads.
void run_kernel_timers(void);

// schedule invoking thread for timeout ticks
// avoid busy loop
int64_t schedule_timeout(int64_t timeout);

/* Sleep and yield the CPU to other threads. */
void timer_sleep (int64_t ticks);
void timer_msleep (int64_t milliseconds);
void timer_usleep (int64_t microseconds);
void timer_nsleep (int64_t nanoseconds);

/* Busy waits. */
void timer_mdelay (int64_t milliseconds);
void timer_udelay (int64_t microseconds);
void timer_ndelay (int64_t nanoseconds);

void timer_print_stats (void);

#endif /* devices/timer.h */
